jetcrab\parser\literals/
array.rs1use crate::ast::{ArrayLiteral, Node, SpreadElement};
2use crate::lexer::TokenKind;
3use crate::parser::error::ParseResult;
4use crate::parser::Parser;
5
6impl Parser {
7 pub fn parse_array_literal(&mut self) -> ParseResult<Node> {
8 self.advance();
9
10 let mut elements = Vec::new();
11
12 while !self.check(TokenKind::RightBracket) && !self.is_eof() {
13 if self.check(TokenKind::Comma) {
14 elements.push(None);
15 self.advance();
16 } else if self.check(TokenKind::Spread) {
17 self.advance();
18 let argument = Box::new(self.parse_expression()?);
19 let span = self.create_span_from_tokens();
20 elements.push(Some(Node::SpreadElement(SpreadElement {
21 argument,
22 span: Some(span),
23 })));
24 } else {
25 elements.push(Some(self.parse_expression()?));
26
27 if self.check(TokenKind::Comma) {
28 self.advance();
29 }
30 }
31 }
32
33 self.expect(TokenKind::RightBracket)?;
34
35 let span = self.create_span_from_tokens();
36 Ok(Node::ArrayLiteral(ArrayLiteral {
37 elements,
38 span: Some(span),
39 }))
40 }
41}